package robot_maker;

import Excepciones.ProcesamientoDato;
import Excepciones.DinamicaDato;
import Excepciones.RobotException;
import Excepciones.Sistema;
import Modelo.BaseDato;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/** La clase Robot se encarga de almacenar las caracteristicas de los robots.
 *
 * @author Carlos
 */
public class Robot {

    private int _codigo;
    private String _nombre;
    private float _peso;
    private float _tamano;
    private String _descripcion;

   /** Contruye el objeto robot
    *
    * @param nombre
    * @param pesoF
    * @param tamanoF
    * @param descripcion
    * @throws RobotException
    */
    public Robot(String nombre, String pesoF, String tamanoF,
            String descripcion) throws RobotException {
           float peso;
           float tamano;
        if ((nombre.isEmpty()) || (descripcion.isEmpty()) || 
                (pesoF.isEmpty()) ||
                (tamanoF.isEmpty())){
            JOptionPane.showMessageDialog(null,
                    "Ningun campo debe ser vacio. " +
                    "El peso y el tamano deben ser mayores a 0.");
            throw new RobotException(15,
                    "CAMPOS VACIOS DE LA TIENDA o VALORES MENORES A CERO(O).",
                    "CONSTRUCTOR");
        }else{
             peso = Float.valueOf(pesoF);
             tamano = Float.valueOf(tamanoF);
            if((peso < 0) || (tamano < 0)){
                JOptionPane.showMessageDialog(null,
                    "Ningun campo debe ser vacio. " +
                    "El peso y el tamano deben ser mayores a 0.");
            throw new RobotException(15,
                    "CAMPOS VACIOS DE LA TIENDA o VALORES MENORES A CERO(O).",
                    "CONSTRUCTOR");
            }
        }
        _nombre = nombre.toUpperCase();
        _peso = peso;
        _tamano = tamano;
        _descripcion = descripcion.toUpperCase();

        
    }


    /** Obtiene la descripcion del robot
     *
     * @return String
     */
    public String getDescripcion() {
        return _descripcion;
    }


    /** Obtiene el nombre del robot
     *
     * @return String
     */
    public String getNombre() {
        return _nombre;
    }


    /** Obtiene el peso del robot
     *
     * @return float
     */
    public float getPeso() {
        return _peso;
    }


    /** Obtiene el tamano del robot
     *
     * @return float
     */
    public float getTamano() {
        return _tamano;
    }


    /** Construye el objeto robot sin ningun parametro
     *
     */
    public Robot(){

    }

    /** Obtiene el nombre del robot
     *
     * @return String
     */
    public String get_nombre() {
        return _nombre;
    }

    /**  Registra un cliente en la base de datos
     *
     * @param nuevo
     * @throws SQLException
     * @throws BasesdeDatos
     * @throws RobotException
     */
    public void ingresarBD (Robot nuevo) throws RobotException,
            ProcesamientoDato{

        if(validarNombre(nuevo._nombre))
        try {
            BaseDato.ejecutarSqlInsert("insert into ROBOT (nombre, peso," +
                    " tamano, descripcion) values ('" + nuevo._nombre + "'," +
                    nuevo._peso + "," + nuevo._tamano + ",'" +
                    nuevo._descripcion + "')");
        } catch (DinamicaDato ex) {
                         throw new ProcesamientoDato(1,
               "NO SE PUDO PROCESAR DATOS FOR FALTA DE LOS MISMOS",
               "EJECUTARSQLSELECT");
        }
    }


    /** Obtiene los datos del robot
     *
     * @param id
     * @return Robot
     * @throws SQLException
     * @throws BasesdeDatos
     */
    public Robot getDatos (int id) throws ProcesamientoDato {
        Robot losa = new Robot();;
        try {
            
            ResultSet lista = null;
            lista = BaseDato.ejecutarSqlSelect("select * from ROBOT where ID="
                    + id);
            losa._codigo = id;
            lista.next();
            losa.setNombre(lista.getString(2));
            losa.setPeso(lista.getFloat(3));
            losa.setTamano(lista.getFloat(4));
            losa.setDescripcion(lista.getString(5));

        } catch (DinamicaDato ex) {
                throw new ProcesamientoDato(1,
               "NO SE PUDO PROCESAR DATOS FOR FALTA DE LOS MISMOS",
               "EJECUTARSQLSELECT");

        } catch (Exception ex) {
            Logger.getLogger(Robot.class.getName()).log(Level.SEVERE, null, ex);
    }
                    return losa;

    }


    /** Modifica los datos del robot
     *
     * @param nuevo
     * @param idOld
     * @throws BasesdeDatos
     * @throws RobotException
     */
    public void modificarBD (Robot nuevo, String idOld) throws RobotException,
            ProcesamientoDato{
         try {
        if (!idOld.equals(nuevo.getNombre())){
            if(validarNombre(nuevo.getNombre()))
           
                BaseDato.ejecutarSqlInsert("update ROBOT set nombre='" +
                        nuevo._nombre + "', peso=" + nuevo._peso + ", tamano="
                        + nuevo._tamano + ", descripcion='" + nuevo._descripcion
                        + "' where id=" + nuevo.getCodigo());

        }else{
        BaseDato.ejecutarSqlInsert("update ROBOT set peso=" + nuevo._peso +
                ", tamano=" + nuevo._tamano +
                ", descripcion='" + nuevo._descripcion + "' where id=" +
                nuevo.getCodigo());
         }
    } catch (DinamicaDato ex) {
                 throw new ProcesamientoDato(1,
               "NO SE PUDO PROCESAR DATOS FOR FALTA DE LOS MISMOS",
               "EJECUTARSQLSELECT");
            }
    }

    /** Coloca el codigo del robot
     *
     * @param _codigo
     */
    public void setCodigo(int _codigo) {
        this._codigo = _codigo;
    }


    /** Valida que el nombre del robot no se repita en la BD
     *
     * @param nombre
     * @return Boolean
     * @throws BasesdeDatos
     * @throws RobotException
     */
    public Boolean validarNombre(String nombre) throws RobotException,
            ProcesamientoDato{
      ResultSet lista = null;
        try {
            lista = BaseDato.ejecutarSqlSelect("select COUNT(*) from ROBOT " +
                    "where nombre='" + nombre.toUpperCase() + "'");
        } catch (DinamicaDato ex) {
                throw new ProcesamientoDato(1,
               "NO SE PUDO PROCESAR DATOS FOR FALTA DE LOS MISMOS",
               "EJECUTARSQLSELECT");        }


           try {
            lista.next();
            if (lista.getString(1).equals("0"))
                return true;
            else{
                JOptionPane.showMessageDialog(null,
                    "Ese nombre ya existe.");
                throw new RobotException(16,
                        "ESA ROBOT YA EXISTE EN LA BASE DE DATO",
                        "validarNombre");
            }

        } catch (Exception ex) {
            Sistema.loggear(14, "validarNombre", "SQL SYNTAXIS", Robot.class,
                    "SQLException");
        }
         return false;
      }


    /** Borra un robot de la base de datos
     * 
     * @param aEliminar
     * @param n
     * @throws BasesdeDatos
     */
    public void borrarBD(int aEliminar, int n) throws ProcesamientoDato{

        if(n == 0){
            try {
                BaseDato.ejecutarSqlInsert("delete from ROBOT where ID=" +
                        aEliminar);
            } catch (DinamicaDato ex) {
                throw new ProcesamientoDato(1,
               "NO SE PUDO PROCESAR DATOS FOR FALTA DE LOS MISMOS",
               "EJECUTARSQLSELECT");            }
        }
    }

    /** Obtiene el codigo del robot
     *
     * @return the _codigo
     */
    public int getCodigo() {
        return _codigo;
    }

    /** Coloca el nombre del robot
     * @param _nombre
     */
    public void setNombre(String nombre) {
        this._nombre = nombre;
    }

    /** Coloca el peso del robot
     *
     * @param _peso
     */
    public void setPeso(float peso) {
        this._peso = peso;
    }

    /** Coloca el tamano del robot
     *
     * @param _tamano
     */
    public void setTamano(float tamano) {
        this._tamano = tamano;
    }

    /** Coloca la descripcion del robot
     *
     * @param _descripcion
     */
    public void setDescripcion(String descripcion) {
        this._descripcion = descripcion;
    }
}
